package com.atguigu.gulimall.order;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * @author xiaoping
 *  使用RabbitMQ
 *  1，引入amqp依赖；RabbitAutoConfiguration 就会自动生效
 *  2，给容器中自动配置了  RabbitTemplate , AmqpAdmin , CachingConnectionFactory , RabbitMessagingTemplate
 *  3, 在配置文件中配置 spring.rabbitmq 信息
 *  4, 启用rabbitmq : @EnableRabbit
 *  5，监听消息：使用@RabbitListener , 必须有@EnableRabbit
 *
 *  本地事务失效问题：
 *      同一个对象内事务方法互调默认失效，原因：绕过了代理对象，事务使用代理对象来控制的
 *    解决：使用代理对象来调用事务方法
 *    1, 引入 aop-starter; spring-boot-starter-aop;引入了aspectj
 *    2, @EnableAspectJAutoProxy(exposeProxy = true): 开启 aspectj 动态代理功能,以后所有动态代理都是aspectj创建的
 *      （即使没有接口也可以创建动态代理）
 *      exposeProxy = true : 对外暴露代理对象
 *    3, 本类互调用代理对象：
 *      XXXServiceImpl service = (XXXServiceImpl)AopContext.currentProxy();
 *         service.b();
 *         service.c();
 *   分布式事务：
 *      1，每一个微服务先必须创建undo_log日志表;
 *      2，安装事务协调器：seata-server:https://github.com/seata/seata/releases
 *      3，整合：
 *          1，导入依赖：spring-cloud-starter-alibaba-seata ， seata-all-0.7.1
 *          2，解压并启动seata-server 对应的 seata-server-0.7.1 服务版本
 *             registry.conf：注册配置信息 修改指定的配置即可
 *             file.conf： 使用文件配置
 *       4,所有想要用到分布式事务的微服务使用seata DataSourceProxy 代理自己的数据源
 *       5，每个微服务，都必须导入：
 *              registry.conf
 *              file.conf   : vgroup_mapping.{application.name}-fescar-service-group = "default"
 *       6, 启动测试分布式事务
 *       7，给分布式大事务的入口标注: @GlobalTransactional
 *       8, 每一个远程的小事务用： @Transactional
 *
 * @RabbitListener: 类+方法上（监听哪些队列即可）
 * @RabbitHandler： 标注方法上（重载区分不同消息）
 */
@EnableRedisHttpSession
@EnableRabbit
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class GulimallOrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(GulimallOrderApplication.class, args);
    }

}
